package com.kyk.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.kyk.entity.Merchants;
import com.kyk.entity.Restaurants;
import com.kyk.entity.Users;
import com.kyk.mapper.MerchantsMapper;
import com.kyk.service.IMerchantsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.kyk.util.CodeUtil;
import com.kyk.util.JwtUtils;
import com.kyk.util.Result;
import com.kyk.util.Utils;
import io.jsonwebtoken.Claims;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 * 商家表 服务实现类
 * </p>
 *
 * @author 凯
 * @since 2025-09-12
 */
@Service
public class MerchantsServiceImpl extends ServiceImpl<MerchantsMapper, Merchants> implements IMerchantsService {

    @Autowired
    MerchantsMapper merchantsMapper;
    @Autowired
    JwtUtils jwtUtils;


    @Override
    public Result addMerchants(Merchants merchants) {
        Utils.checkEmpty(merchants.getUsername(), "用户名不能为空")
                .checkEmpty(merchants.getPassword(), "密码不能为空")
                .checkEmpty(merchants.getName(), "商家名称不能为空")
                .checkEmpty(merchants.getContactPhone(), "联系电话不能为空")
                .checkEmpty(merchants.getContactEmail(), "联系邮箱不能为空")
                .checkEmpty(merchants.getIdCard(), "身份证号不能为空")
                .checkEmpty(merchants.getBusinessLicense(), "营业执照号不能为空")
                .checkEmpty(merchants.getBusinessLicenseUrl(), "营业执照图片不能为空");
        // 检查用户名是否已存在
        if (merchantsMapper.selectOne(new LambdaQueryWrapper<Merchants>().eq(Merchants::getUsername, merchants.getUsername())) != null) {
            return new Result(CodeUtil.ADD_ERROR, "用户名已存在");
        }
        // 检查联系电话是否已存在
        if (merchantsMapper.selectOne(new LambdaQueryWrapper<Merchants>().eq(Merchants::getContactPhone, merchants.getContactPhone())) != null) {
            return new Result(CodeUtil.ADD_ERROR, "联系电话已存在");
        }
        // 检查联系邮箱是否已存在
        if (merchantsMapper.selectOne(new LambdaQueryWrapper<Merchants>().eq(Merchants::getContactEmail, merchants.getContactEmail())) != null) {
            return new Result(CodeUtil.ADD_ERROR, "联系邮箱已存在");
        }
        // 检查身份证号是否已存在
        if (merchantsMapper.selectOne(new LambdaQueryWrapper<Merchants>().eq(Merchants::getIdCard, merchants.getIdCard())) != null) {
            return new Result(CodeUtil.ADD_ERROR, "身份证号已存在");
        }
        // 检查营业执照号是否已存在
        if (merchantsMapper.selectOne(new LambdaQueryWrapper<Merchants>().eq(Merchants::getBusinessLicense, merchants.getBusinessLicense())) != null) {
            return new Result(CodeUtil.ADD_ERROR, "营业执照号已存在");
        }
        // 加密密码
        merchants.setPassword(DigestUtils.md5DigestAsHex((merchants.getUsername() + merchants.getPassword()).getBytes()));
        // 设置默认状态为待审核
        merchants.setStatus( 0);
        merchants.setCreatedAt(LocalDateTime.now());
        // 新增商家
        int result = merchantsMapper.insert(merchants);
        if (result > 0) {
            return new Result(CodeUtil.ADD_OK, "成为商家请求提交成功,请注意邮箱信息");
        }
        return new Result(CodeUtil.ADD_ERROR, "成为商家请求提交失败");
    }

    @Override
    public Result login(Merchants merchants) {
        // 1. 先校验非空（最基础的参数校验）
        Utils.checkEmpty(merchants.getUsername(), "用户名不能为空")
                .checkEmpty(merchants.getPassword(), "密码不能为空");

        // 2. 计算加密后的密码（提前处理，避免重复计算）
        String encryptedPassword = DigestUtils.md5DigestAsHex(
                (merchants.getUsername() + merchants.getPassword()).getBytes()
        );

        // 3. 查询商家（仅通过用户名查询，不包含密码条件，便于后续区分错误类型）
        Merchants merchant = merchantsMapper.selectOne(
                new LambdaQueryWrapper<Merchants>()
                        .eq(Merchants::getUsername, merchants.getUsername())
        );

        // 4. 先判断商家是否存在
        if (merchant == null) {
            return new Result(CodeUtil.QUERY_ERROR, "商家不存在"); // 不明确提示，避免信息泄露
        }

        // 5. 再判断商家状态（存在但禁用，无需校验密码）
        if (merchant.getStatus() == 0) {
            return new Result(CodeUtil.QUERY_ERROR, "商家审核未通过");
        }

        // 6. 最后校验密码（最敏感的逻辑放在最后）
        if (!merchant.getPassword().equals(encryptedPassword)) {
            return new Result(CodeUtil.QUERY_ERROR, "用户名或密码错误");
        }

        // 7. 登录成功
        String id = merchant.getId().toString();
        //生成jwt令牌
        String token = jwtUtils.generateToken(Long.parseLong(id),"MERCHANT");
        return new Result(CodeUtil.QUERY_OK, "登录成功", token);
    }

     @Override
    public Result getCurrentMerchant(Long merchantId, String userType) {

         // 额外校验：确保用户类型正确（可选，增强安全性）
         if (!"MERCHANT".equals(userType)) {
             return new Result(CodeUtil.PERMISSION_DENIED, "权限错误");
         }

         // 无需再处理token，直接用用户ID查询数据库
         Merchants merchant = merchantsMapper.selectById(merchantId);
         if (merchant == null) {
             return new Result(CodeUtil.QUERY_ERROR, "商家不存在");
         }
         return new Result(CodeUtil.QUERY_OK, "查询成功", merchant);
    }


}
